﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

using System.Windows.Forms;

namespace FrbaBus
{
    public class Usuario
    {

        //private string nombre;
        //private string password;
        //private bool habilitado;
        //private string[] listaFuncionalidades;
        //private string rol;
        //private int idUsuario;

        public string Nombre { get; set; }
        public string Password { get; set; }
        public bool Habilitado { get; set; }
        public int LoginFallidos { get; set; }
        public List<string> ListaFuncionalidades { get; set; }
        public string Rol { get; set; }
        public int IdUsuario { get; set; }

        public Usuario()
        {
            Nombre = "";
            Password = "";
            Rol = "";
        }
        
        /* Aca se define el Store Procedure para buscar un Usuario por @usuario y @password*/
        private string stBusquedaUsuario = "BuscarUsuario";

        /* Aca se define el Store Procedure para inhabilitar el Usuario por @usuario*/
        private string stInhabilitarUsuario = "InhabilitarUsuario";

        /* Aca se define el Store Procedure para saber si el nombre de usuario es valido por @usuario*/
        private string stBusquedaNombreDeUsuario = "BuscarNombreDeUsuario";

        /* Aca se define el Store Procedure para buscar un Rol por @usuario*/
        private string stBusquedaRol = "BuscarRol";

        /* Aca tendria que venir el Store Procedure para buscar las funcionalidades de un Rol*/
        private string stBusquedaFuncionalidades = "select Rol from GRUPO_PLAZA.Usr01Rol where Uname like @usuario";


        /* Busca todas las funcionalidades de un rol*/
        private List<string> obtenerFuncionalidades(string rol)
        {
            try
            {

                List<string> lstFunc = new List<string>();

                /*creo una nueva conexion*/
                SqlConnection conexion = ConexionSQL.crearConexion();

                /*creo un nuevo comando Sql*/
                SqlCommand comandoSql = new SqlCommand();

                /*indico la conexion que va a usar el comando*/
                comandoSql.Connection = conexion;

                /*le paso la cadena string indicando su respectivo query o store procedure*/
                comandoSql.CommandText = stBusquedaFuncionalidades;

                /*indico que tipo de consulta es*/
                comandoSql.CommandType = CommandType.Text;

                /*agrego los valores que se les pasa por parametro a la consulta*/
                comandoSql.Parameters.AddWithValue("@usuario", rol);
                
                /*creo un adaptador se encarga de abrir y cerrar la conexion*/
                SqlDataAdapter dataAdapter = new SqlDataAdapter(comandoSql);

                DataSet dataSet = new DataSet();

                dataAdapter.Fill(dataSet);

                dataSet.Tables[0].TableName = "Funcionalidades";

                if (dataSet.Tables["Funcionalidades"].Rows.Count > 0)
                {

                    
                    for (int i = 0; i < dataSet.Tables["Funcionalidades"].Rows.Count ; i++)
                    {
                        lstFunc.Add(Convert.ToString(dataSet.Tables["Funcionalidades"].Rows[i][0]));
                    }

                   
                }

                return lstFunc;
            }
            catch (Exception ex)
            {
                throw ex;
            }

            
        }

        /**/
        private void obtenerRolDeUsuario(string nombreUsuario)
        {
            try
            {

                /*creo una nueva conexion*/
                SqlConnection conexion = ConexionSQL.crearConexion();

                /*creo un nuevo comando Sql*/
                SqlCommand comandoSql = new SqlCommand();

                /*indico la conexion que va a usar el comando*/
                comandoSql.Connection = conexion;

                /*le paso la cadena string indicando su respectivo query o store procedure*/
                comandoSql.CommandText = stBusquedaRol;

                /*indico que tipo de consulta es*/
                comandoSql.CommandType = CommandType.StoredProcedure;

                /*agrego los valores que se les pasa por parametro a la consulta*/
                comandoSql.Parameters.AddWithValue("@usuario", nombreUsuario);

                /*creo un adaptador se encarga de abrir y cerrar la conexion*/
                SqlDataAdapter dataAdapter = new SqlDataAdapter(comandoSql);

                DataSet dataSet = new DataSet();

                dataAdapter.Fill(dataSet);

                dataSet.Tables[0].TableName = "Rol";

                if (dataSet.Tables.Count > 0)
                {
                    Rol = Convert.ToString(dataSet.Tables["Rol"].Rows[0]["Rol"]);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /*  Busca al usuario por @usuario y @password en BD. 
         * Si se encontro al usuario devuelve 'true' en caso de no encontrarse devuelve 'false' */
        public bool buscarmeEnBase(string nombreUsuario,string password)
        {
            bool encontrado = false;

            try
            {

                /*creo una nueva conexion*/
                SqlConnection conexion = ConexionSQL.crearConexion();

                /*creo un nuevo comando Sql*/
                SqlCommand comandoSql = new SqlCommand();

                /*indico la conexion que va a usar el comando*/
                comandoSql.Connection = conexion;

                /*le paso la cadena string indicando su respectivo query o store procedure*/
                comandoSql.CommandText = stBusquedaUsuario;

                /*indico que tipo de consulta es*/
                comandoSql.CommandType = CommandType.StoredProcedure;

                /*agrego los valores que se les pasa por parametro a la consulta*/
                comandoSql.Parameters.AddWithValue("@usuario", nombreUsuario);
                comandoSql.Parameters.AddWithValue("@password", password);
            

                /*creo un adaptador se encarga de abrir y cerrar la conexion*/
                SqlDataAdapter dataAdapter = new SqlDataAdapter(comandoSql);

                DataSet dataSet = new DataSet();

                dataAdapter.Fill(dataSet);



                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    /*Indico el nombre de la tabla como Usuario*/
                    dataSet.Tables[0].TableName = "Usuario";

                    /*Lleno las propiedades del objeto usuario*/
                    Nombre = Convert.ToString(dataSet.Tables["Usuario"].Rows[0]["Uname"]);
                    Password = Convert.ToString(dataSet.Tables["Usuario"].Rows[0]["Password"]);
                    LoginFallidos = Convert.ToInt32(dataSet.Tables["Usuario"].Rows[0]["LoginFallidos"]);
                    /*Aca estaria la funcion para obtener el rol correspondiente*/
                    Rol = "Admisitrador";
                    /*Corregir esta parte ya que tenfria que pasarle el Rol no el UserName*/
                    ListaFuncionalidades = obtenerFuncionalidades(Nombre);
                    
                    encontrado = true;
                }

                

                return encontrado;
            }
            catch (Exception ex)
            {
                throw ex;
            }
                       
        }

        public bool nombreDeUsuarioValido(string nombreUsuario)
        {
            try
            {

                /*creo una nueva conexion*/
                SqlConnection conexion = ConexionSQL.crearConexion();

                /*creo un nuevo comando Sql*/
                SqlCommand comandoSql = new SqlCommand();

                /*indico la conexion que va a usar el comando*/
                comandoSql.Connection = conexion;

                /*le paso la cadena string indicando su respectivo query o store procedure*/
                comandoSql.CommandText = stBusquedaNombreDeUsuario;

                /*indico que tipo de consulta es*/
                comandoSql.CommandType = CommandType.StoredProcedure;

                /*agrego los valores que se les pasa por parametro a la consulta*/
                comandoSql.Parameters.AddWithValue("@usuario", nombreUsuario);
                


                /*creo un adaptador se encarga de abrir y cerrar la conexion*/
                SqlDataAdapter dataAdapter = new SqlDataAdapter(comandoSql);

                DataSet dataSet = new DataSet();


                dataAdapter.Fill(dataSet);



                if (dataSet.Tables[0].Rows.Count > 0)
                {
                    LoginFallidos = Convert.ToInt32(dataSet.Tables[0].Rows[0]["LoginFallidos"]);
                    Habilitado = Convert.ToBoolean(dataSet.Tables[0].Rows[0]["Habilitado"]);
                    return true;                    
                }

                return false;
            }
            catch (Exception ex)
            {
                throw ex;
            }
                       
           
        }

        public void inhabilitarUsuario()
        {

            try
            {

                /*creo una nueva conexion*/
                SqlConnection conexion = ConexionSQL.crearConexion();

                /*creo un nuevo comando Sql*/
                SqlCommand comandoSql = new SqlCommand();

                /*indico la conexion que va a usar el comando*/
                comandoSql.Connection = conexion;

                /*le paso la cadena string indicando su respectivo query o store procedure*/
                comandoSql.CommandText = stInhabilitarUsuario;

                /*indico que tipo de consulta es*/
                comandoSql.CommandType = CommandType.StoredProcedure;

                /*agrego los valores que se les pasa por parametro a la consulta*/
                comandoSql.Parameters.AddWithValue("@usuario", this.Nombre);

                conexion.Open();

                comandoSql.ExecuteNonQuery();

                conexion.Close();
                         
            }
            catch (Exception ex)
            {
                throw ex;
            }
 
        }
    
        
    }/*fin de la clase*/
}/*fin del namespace*/
